package cn.com.guage.dtm.metadata.service.impl;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Optional;

import cn.com.guage.dtm.common.utils.DateUtils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import cn.com.guage.dtm.metadata.mapper.MdEnvMapper;
import cn.com.guage.dtm.metadata.domain.MdEnv;
import cn.com.guage.dtm.metadata.domain.MdReverseEngineering;
import cn.com.guage.dtm.metadata.service.IMdEnvService;
import cn.com.guage.dtm.utils.AESDecrypt;
import cn.com.guage.dtm.utils.AESEncrypt;
import cn.com.guage.dtm.common.core.text.Convert;
import cn.com.guage.dtm.common.exception.BusinessException;

/**
 * 环境管理Service业务层处理
 * 
 * @author liujun
 * @date 2021-06-24
 */
@Service
public class MdEnvServiceImpl implements IMdEnvService 
{
	
	private static final Logger log = LoggerFactory.getLogger(MdEnvServiceImpl.class);
	
    @Autowired
    private MdEnvMapper mdEnvMapper;

    /**
     * 查询环境管理
     * 
     * @param envId 环境管理ID
     * @return 环境管理
     */
    @Override
    public MdEnv selectMdEnvById(Long envId)
    {
        return mdEnvMapper.selectMdEnvById(envId);
    }

    /**
     * 查询环境管理列表
     * 
     * @param mdEnv 环境管理
     * @return 环境管理
     */
    @Override
    public List<MdEnv> selectMdEnvList(MdEnv mdEnv)
    {
        return mdEnvMapper.selectMdEnvList(mdEnv);
    }

    /**
     * 新增环境管理
     * 
     * @param mdEnv 环境管理
     * @return 结果
     */
    @Override
    public int insertMdEnv(MdEnv mdEnv)
    {
        mdEnv.setCreateTime(DateUtils.getNowDate());
        return mdEnvMapper.insertMdEnv(mdEnv);
    }

    /**
     * 修改环境管理
     * 
     * @param mdEnv 环境管理
     * @return 结果
     */
    @Override
    public int updateMdEnv(MdEnv mdEnv)
    {
        mdEnv.setUpdateTime(DateUtils.getNowDate());
        return mdEnvMapper.updateMdEnv(mdEnv);
    }

    /**
     * 删除环境管理对象
     * 
     * @param ids 需要删除的数据ID
     * @return 结果
     */
    @Override
    public int deleteMdEnvByIds(String ids)
    {
        return mdEnvMapper.deleteMdEnvByIds(Convert.toStrArray(ids));
    }

    /**
     * 删除环境管理信息
     * 
     * @param envId 环境管理ID
     * @return 结果
     */
    @Override
    public int deleteMdEnvById(Long envId)
    {
        return mdEnvMapper.deleteMdEnvById(envId);
    }
    
    
	@Override
	public int extractDbMetadata(MdEnv mdEnv,boolean isMetaSave) {
			// new driver class is `com.mysql.cj.jdbc.Driver'
			Connection conn = null;
			ResultSet rs = null;
			String password = mdEnv.getJdbcPassword();
			if (log.isDebugEnabled())
				log.debug("password before Decry is {}.", password);
			if (isMetaSave) {
				AESDecrypt decry = new AESDecrypt(AESEncrypt.ENCRYPASSWORD);
				password = decry.decryptForCBC(mdEnv.getJdbcPassword());
				mdEnv.setJdbcPassword(password);
			}
			if (log.isDebugEnabled())
				log.debug("password after Decry is {}.", password);

			try {
				Class.forName(mdEnv.getJdbcDriver());
				conn = DriverManager.getConnection(mdEnv.getJdbcConnString(),
						mdEnv.getJdbcUsername(), mdEnv.getJdbcPassword());
				DatabaseMetaData databaseMetaData = conn.getMetaData();
				String[] types = { "TABLE" };
				rs = databaseMetaData.getTables(null, mdEnv.getJdbcUsername(), "%", types);
			}catch (Exception e) {
				log.error("测试连接数据库失败",e);
				throw new BusinessException("测试连接数据库失败", e);
			}
			finally {
				Optional.ofNullable(rs).ifPresent(r->{
					try {
						r.close();
					} catch (SQLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				});
			}
			return 1;
		}
}
